import scala.util.Random

/**
 *  1.1 作业需求
        1. 选取对战角色
        2. 开始对战，用户出拳，与对手进行比较，提示胜负信息
        3. 猜拳结束算分，平局都加一分，获胜加二分，失败不加分
        4 . 循环对战，当输入“n”时，终止对战，并显示对战结果
        5. 游戏结束后显示得分

     1.2 作业分析
    分析业务逻辑，抽象出类、类的属性和方法，如下：
        1. 创建用户类User，定义类的属性（name，score）和类的方法（showFist())
        2. 创建计算机类Computer，定义类的属性（name，score）和类的方法（showFist())
        3. 实现计算机随机出拳
        4. 创建游戏类Game，定义类的属性（甲方玩家、乙方玩家、对战次数）
        5. 编写初始化方法、游戏开始方法
 */

class User(name: String, var score: Int){
  var win: Int = _  //胜局数
  var draw: Int = _  //和局数
  var lose: Int = _  //负局数

  def showFist(): Int = {
    println("请出拳! 1.剪刀 2.石头 3.布")
    val line = scala.io.StdIn.readLine()
    var fist = 0
    line match {
      case "1" =>
        println("你出拳:剪刀")
        fist = 1
      case "2" =>
        println("你出拳:石头")
        fist = 2
      case "3" =>
        println("你出拳:布")
        fist = 3
      case _ =>
        println("输入不符合规范,默认出布!")
        fist = 3
    }
    fist
  }
}

class Computer(name: String, var score: Int){
  var win: Int = _  //胜局数
  var draw: Int = _  //和局数
  var lose: Int = _  //负局数

  def showFist(): Int = {
    println(s"${name}出拳!")
    val fist = Random.nextInt(3)
    fist match {
      case 0 => println(s"${name}出拳:剪刀")
      case 1 => println(s"${name}出拳:石头")
      case 2 => println(s"${name}出拳:布")
    }
    fist + 1
  }
}

class Game(player1: String, player2: String, var battleTimes: Int){

  var user: User = _
  var computer: Computer = _

  //初始化方法
  def initGame(): Unit ={
    user = new User(player1, 0)
    computer = new Computer(player2, 0)
  }

  //游戏开始方法
  def startGame(): Unit ={
    println(s"你选择了与${player2}对战")
    println("要开始么? y/n")
    var flag = true
    //使用flag终止循环
    while (flag){
      val confirm: String = scala.io.StdIn.readLine()
      confirm match {
        case "y" =>
          //对战次数+1
          battleTimes += 1
          val userFist = user.showFist()
          val comFist = computer.showFist()
          //计算对战结果：0是和局，1和-2是胜局，其余为负局，同时累计双方分数及胜、和、负局数
          val result = userFist - comFist
          result match {
            case 0 =>
              println("结果：和局! 下次继续努力")
              user.draw += 1
              user.score += 1
              computer.draw += 1
              computer.score += 1
            case _ if (result == 1 || result == -2) =>
              println("结果：恭喜,你赢啦!")
              user.win += 1
              user.score += 2
              computer.lose += 1
            case _ =>
              println("结果：可惜,你输了! 下次继续努力")
              user.lose += 1
              computer.win += 1
              computer.score += 2
          }
          println("是否开始下一轮 (y/n)")
        case "n" =>
          flag = false
        case _ => println("请输入y/n确认是否开始游戏")
      }
    }
    println("退出游戏!")
    println("-----------------------------------------------------")
    println(s"$player1 VS $player2")
    println(s"对战次数${battleTimes}次")
    println()
    println()
    println("姓名 \t 等分 \t 胜局 \t 和局 \t 负局")
    println(s"$player1 \t ${user.score} \t\t ${user.win} \t\t ${user.draw} \t\t ${user.lose}")
    println(s"$player2 \t ${computer.score} \t\t ${computer.win} \t\t ${computer.draw} \t\t ${computer.lose}")
    println("-----------------------------------------------------")
  }
}

object Subject2 {
  def main(args: Array[String]): Unit = {
    println("------------------欢迎进入游戏世界-------------------")
    println("*****************************")
    println("***********猜拳,开始**********")
    println("*****************************")
    println()
    println()
    println("请选择对战角色:(1.刘备 2.关羽 3.张飞)")
    val num: Int = scala.io.StdIn.readInt()
    var character = ""
    num match {
      case 1 =>
        character = "刘备"
      case 2 =>
        character = "关羽"
      case 3 =>
        character = "张飞"
      case _ =>
        println("输入不符合规范,默认选择与刘备对战")
        character = "刘备"
    }
    val game = new Game("游客", character, 0)
    game.initGame()
    game.startGame()
  }
}
